package com.example.learnvideo.widget

import android.content.Context
import android.net.Uri
import android.os.Handler
import android.os.Looper
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.widget.*
import com.example.learnvideo.R
import com.example.learnvideo.util.DateUtil
import java.util.*

/**
 *
 * @Author： LJH
 * @Time： 2022/7/18
 * @description：
 */
class VideoController(context: Context,attrs:AttributeSet):RelativeLayout(context, attrs),SeekBar.OnSeekBarChangeListener {

    init {
        initView(context)
    }

    companion object{
        const val TAG = "VideoController"
    }
    // 声明用于播放控制的图像视图对象
    private lateinit var ivPlay:ImageView
    // 声明用于展示当前时间的文本视图对象
    private lateinit var tvCurrent:TextView
    // 声明用于展示播放时长的文本视图对象
    private lateinit var tvTotal:TextView
    // 声明一个拖动条对象
    private lateinit var sbProgress:SeekBar
    // 声明一个视频视图对象
    private lateinit var mVideoView:VideoView
    // 播放时长，单位毫秒
    private var mDuration:Int = 0
    // 声明一个处理器对象
    private val mHandler = Handler(Looper.myLooper()!!)
    // 当前的播放位置
    private var mCurrentPosition = 0

    // 初始化视图
    private fun initView(context: Context){
        // 根据布局文件bar_controller.xml生成视图对象
        val view = LayoutInflater.from(context).inflate(R.layout.bar_controller,null)
        ivPlay = view.findViewById(R.id.iv_play)
        tvCurrent = view.findViewById(R.id.tv_current)
        tvTotal = view.findViewById(R.id.tv_total)
        sbProgress = view.findViewById(R.id.sb_progress)
        ivPlay.setOnClickListener {
            if (mVideoView.isPlaying){
                mVideoView.pause()
                ivPlay.setImageResource(R.drawable.btn_play)
            }else{
                mVideoView.start()
                ivPlay.setImageResource(R.drawable.btn_pause)
            }
        }
        ivPlay.isEnabled = false
        sbProgress.isEnabled = false
        sbProgress.setOnSeekBarChangeListener(this)
        addView(view)
    }

    // 在进度变更时触发。第三个参数为true表示用户拖动，为false表示代码设置进度
    // 如果是人为的改变进度（即用户拖动进度条），则令视频从指定时间点开始播放
    override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
        if (fromUser){
            // 计算拖动后的当前时间进度
            val time = progress * mDuration / 100
            // 拖动播放器的当前进度到指定位置
            mVideoView.seekTo(time)
        }
    }

    // 在开始拖动进度时触发
    override fun onStartTrackingTouch(seekBar: SeekBar?) {}

    // 在停止拖动进度时触发
    override fun onStopTrackingTouch(seekBar: SeekBar?) {}

    // 准备播放指定路径的视频
    fun prepare(view:VideoView,uri:Uri){
        visibility = View.VISIBLE
        ivPlay.isEnabled = true
        sbProgress.isEnabled = true
        mVideoView = view
        // 设置视频视图的视频路径
        mVideoView.setVideoURI(uri)
        // 给视频视图设置播放准备监听器，准备完毕获取播放时长
        mVideoView.setOnPreparedListener{
            mDuration = mVideoView.duration
        }
        // 给视频视图设置播放完成监听器，播放完毕重置当前进度
        mVideoView.setOnCompletionListener { setCurrentTime(0,0) }
        // 获取播放时长
        mDuration = mVideoView.duration
        // 立即启动进度刷新任务
        mHandler.post(mRefresh)
    }

    //开始播放
    fun start(){
        mVideoView.start()
    }

    // 定义一个控制条的进度刷新任务。实时刷新控制条的播放进度，每隔0.5秒刷新一次
    private val mRefresh = object : Runnable{
        override fun run() {
            // 视频视图正在播放
            if (mVideoView.isPlaying){
                // 给视频控制条设置当前的播放位置和缓冲百分比
                setCurrentTime(mVideoView.currentPosition,mVideoView.bufferPercentage)
            }
            // 延迟500毫秒后再次启动进度刷新任务
            mHandler.postDelayed(this,500)
        }
    }

    // 设置当前的播放时间，同步VideoView的播放进度
    fun setCurrentTime(currentTime:Int,bufferTime:Int){
        // 在开头或者处于暂停状态
        if(currentTime == 0 || !mVideoView.isPlaying){
            ivPlay.setImageResource(R.drawable.btn_play)
        }else{
            ivPlay.setImageResource(R.drawable.btn_pause)
        }
        // 显示当前时间
        tvCurrent.text = "${DateUtil.formatTime(currentTime.toLong())}"
        //显示总时长
        tvTotal.text = "${DateUtil.formatTime(mDuration.toLong())}"
        // 播放时长为零
        if (mDuration == 0){
            // 设置拖动条的当前进度为零
            sbProgress.progress = 0
        } else {
            // 设置拖动条的当前进度为播放进度
            sbProgress.progress = if (currentTime == 0) 0 else ( currentTime * 100 / mDuration )
        }
        // 显示拖动条的缓冲进度
        sbProgress.secondaryProgress = bufferTime

    }

    //恢复播放
    fun resume(){
        // 恢复页面时立即从上次断点开始播放视频
        if (mCurrentPosition> 0 && !mVideoView.isPlaying){
            // 找到指定位置
            mVideoView.seekTo(mCurrentPosition)
            // 视频视图开始播放
            mVideoView.start()
        }
    }

    //暂停播放
    fun pause(){
        // 暂停页面时保存当前的播放进度
        if (mVideoView.isPlaying){
            // 获得视频视图当前的播放位置
            mCurrentPosition = mVideoView.currentPosition
            mVideoView.pause()
        }
    }

    //释放播放资源
    fun release(){
        // 移除所有的处理器任务
        mHandler.removeCallbacksAndMessages(null)
    }
}